﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*********************四，分⽀和循环（下）*********************/
/*************写⼀个猜数字游戏**************/

//int main()
//{
//	srand((unsigned int)time(NULL));
//	//rand() --> 0~32767    
//	printf("%d\n", rand() % 100 + 1); //0 ~ 99 + 1 ---> 1~100
//
//	printf("%d\n", rand() % 101); //1~100
//
//	printf("%d\n", rand() % 101 + 100);//100~200
//	//rand() % (b - a + 1) + a,产生a到b的值
//
//	return 0;
// }

//玩完一次可以继续玩，不需要退出
//1.玩游戏
//0.退出游戏

//void menu()
//{
//	printf("--------------------\n");
//	printf("******1.玩游戏******\n");
//	printf("******0.退出游戏****\n");
//	printf("--------------------\n");
//}
//
//void game()
//{
//	int guess = 0;
//	int r = rand() % 101;
//
//	while(1)
//	{
//		printf("请猜数字：");
//		scanf("%d", &guess);
//		if (guess > r)
//			printf("猜大了\n");
//		else if (guess < r)
//			printf("猜小了\n");
//		else
//		{
//			printf("恭喜你猜对了,随机数是:%d\n",r);
//			break;
//		}
//	}
//}
//int main()
//{
//	int input = 0;
//	srand((unsigned int)time(NULL));//设置一次随机数种子就可以了
//
//	do
//	{
//		menu();
//		printf("请选择:");
//		scanf("%d",&input);
//		switch (input)
//		{
//		case 1:
//			game();
//			break;
//		case 0:
//			printf("退出游戏\n");
//			break;
//		default:
//			printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input != 0);
//	return 0;
//}

//*****优化版本
//void menu()
//{
//	printf("--------------------\n");
//	printf("******1.玩游戏******\n");
//	printf("******0.退出游戏****\n");
//	printf("--------------------\n");
//}
//
//void game()
//{
//	int guess = 0;
//	int r = rand() % 101;
//
//	int count = 5;
//	while (count)
//	{
//		printf("你还有%d次机会\n",count);
//		printf("请猜数字：");
//		scanf("%d", &guess);
//		if (guess > r)
//			printf("猜大了\n");
//		else if (guess < r)
//			printf("猜小了\n");
//		else
//		{
//			printf("恭喜你猜对了,随机数是:%d\n", r);
//			break;
//		}
//		count--;
//	}
//	if (count == 0)
//	{
//		printf("5次机会已用完，你失败了\n");
//	}
//
//}
//int main()
//{
//	int input = 0;
//	srand((unsigned int)time(NULL));//设置一次随机数种子就可以了
//
//	do
//	{
//		menu();
//		printf("请选择:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			game();
//			break;
//		case 0:
//			printf("退出游戏\n");
//			break;
//		default:
//			printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input != 0);
//	return 0;
//}


/***************************/


/******************五, 数组*****************/
/*****2. ⼀维数组的创建和初始化*****/
//int main()
//{
//	int arr[5];
//	float arr[2];
//	char arr3[4];
//
//	int arr4[5] = { 1,2,3,4,5 };//完全初始化
//
//	int arr5[5] = { 1,2,3 };//不完全初始化,剩余的元素默认初始化为0
//
//	//数组一旦初始化，其实数组大小可以省略
//	int arr6[] = { 1,2,3,4,5,6,7,8,9,10 };//根据初始化内容确定数组大小
//	return 0; 
//}

// 数组的类型
//int main()
//{
//	int num = 0;
//	int arr[10];//arr数组的类型是int [10]
//	return 0;
//}

//int main()
//{
//	int arr[10];
//	printf("%zd\n",sizeof(arr));
//	printf("%zd\n",sizeof(int [10]));
//	printf("%zd", sizeof(char));
//	return 0;
//} 

 
/*****3. ⼀维数组的使用*****/
//3.1 数组下标
//在C语⾔中数组的访问提供了⼀个操作符[]，这个操作符叫：下标引⽤操作符
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	printf("%d\n",arr1[6]);
//	arr1[6] = 70;
//	printf("%d\n",arr1[6]);
//	return 0;
//}

//3.2 数组元素的打印
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//
//	//输入
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d",&arr1[i]);
//	}
//
//	//输出
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ",arr1[i]);
//	}
//	return 0;
//}


/*****4. ⼀维数组在内存中的存储*****/
//：数组在内存中是连续存放的
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("arr[%d] = %p\n",i,&arr1[i]);
//	}
//	return 0;
//} 


/*****5. sizeof 计算数组元素个数*****/

//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10,11,22,33,44 };
//	int i = 0;
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	printf("%d\n",sz);
//
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//
//	return 0;
//}


/************6. ⼆维数组的创建***********/

//int main()
//{
//	int arr[3][5];
//	double arr1[4][6];
//	return 0;
//}

/********7. ⼆维数组的初始化*******/
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };//完全初始化
//	//1 2 3 4 5
//	//6 7 8 9 10
//	//11 12 13 14 15
//
//	int arr1[3][5] = { 1,2,3,4,5,6,7,8};//不完全初始化
//	//1 2 3 4 5
//	//6 7 8 0 0
//	//0 0 0 0 0
//	 
//	int arr2[3][5] = { {1,2},{3,4},{5,6} };//按行初始化
//	//1 2 0 0 0
//	//3 4 0 0 0
//	//5 6 0 0 0
//
//	//二维数组如果初始化，行可以省，但列不能省
//	int arr[][5] = { {1,2},{3,4},{5,6} };
//
//	return 0;
// }


/******** 8. ⼆维数组的使⽤*******/
//8.1 ⼆维数组的下标
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
//
//	printf("%d\n",arr[2][4]);
//	printf("%d\n", arr[0][2]);
//	int i = 0;//行
//	int j = 0;//列
//
//	//输入
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d",&arr[i][j]);
//		}
//	}
//
//	//输出
//	for (i = 0; i < 3; i++)
//	{
//		//打印一行
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ",arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
// }


/******** 9. ⼆维数组在内存中的存储*******/
//⼆维数组中的每个元素也是连续存放的
//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3;i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);
//		}
//	}
//	return 0;
//}


/*********10. C99中的变⻓数组********/
//在C99标准之前，C语⾔在创建数组的时候，数组⼤⼩的指定只能使⽤常量、常量表达式
//c99中引入了变长数组
//变长数组就是数组大小是变量的数组
//数组大小可以使用变量指定

//int main()
//{
//	int arr1[10];
//
//	int arr2[3 + 5];
//
//	/*int n = 10;
//	int arr[n] = { 0 };*/ //vs2022不支持c99变长数组
//
//
//	return 0;
//}


/*********11. 数组练习********/
//练习1：多个字符从两端移动，向中间汇聚
//#include <string.h>
//#include <windows.h>
//#include <stdlib.h>
//
//int main()
//{
//	char arr1[] = "welcome to bit !!!!!!!!";
//	char arr2[] = "#######################";
//
//	int left = 0;
//	//int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
//	int right = strlen(arr1) - 1; //strlen求字符串长度：统计\0之前的个数
//
//	while(left <= right)
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);//休眠1000毫秒
//		system("cls");//执行系统命令
//		left++;
//		right--;
//	}
//	printf("%s\n", arr2);
//
//	return 0;
//}


//练习2：⼆分查找

//遍历查找
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//升序
//	//查找一个值
//	int k = 0;
//	scanf("%d",&k);
//	//查找
//	//遍历数组
//	int  i = 0;
//	int flag = 0;//假设找不到
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		if (arr[i] == k)
//		{
//			printf("找到了，下标是:%d\n",i);
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到");
//	}
//	return 0;
//}

//二分查找(有序的数组)
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//升序
//	//查找一个值
//	int k = 0;
//	scanf("%d",&k);
//	//查找
//	//二分查找
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	
//	
//	//一次查找的过程
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是:%d\n", mid);
//			break;
//		}
//	}
//	if (left > right)
//	{
//		printf("找不到");
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//升序
//	//查找一个值
//	int k = 0;
//	scanf("%d",&k);
//	//查找
//	//二分查找
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	
//	
//	//一次查找的过程
//	while (left <= right)
//	{
//		int mid = left + (right - left) / 2;//优化不会溢出
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是:%d\n", mid);
//			break;
//		}
//	}
//	if (left > right)
//	{
//		printf("找不到");
//	}
//	return 0;
//}
   